1 R yükleme

http://www.youtube.com/watch?v=XcBLEVknqvY

What is R?

1.2 RStudio

https://www.rstudio.com/

https://www.rstudio.com/products/rstudio/download/

https://moderndive.com/2-getting-started.html


1.2.1 RStudio eklentileri

  • Discover and install useful RStudio addins

https://cran.r-project.org/web/packages/addinslist/README.html

https://rstudio.github.io/rstudioaddins/

Skipping install of 'addinexamples' from a github remote, the SHA1 (fae96091) has not changed since last install.
  Use `force = TRUE` to force installation

2 R paketleri

2.1 Neden paketler var



https://blog.mitchelloharawild.com/blog/user-2018-feature-wall/


2.2 Paketleri nereden bulabiliriz


2.4 R paket yükleme

install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")

4 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


4.1 Excel

4.2 SPSS

4.3 csv


5 Veriyi görüntüleme

      year          month             day       
 Min.   :2013   Min.   : 1.000   Min.   : 1.00  
 1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00  
 Median :2013   Median : 7.000   Median :16.00  
 Mean   :2013   Mean   : 6.549   Mean   :15.71  
 3rd Qu.:2013   3rd Qu.:10.000   3rd Qu.:23.00  
 Max.   :2013   Max.   :12.000   Max.   :31.00  
                                                
    dep_time    sched_dep_time   dep_delay      
 Min.   :   1   Min.   : 106   Min.   : -43.00  
 1st Qu.: 907   1st Qu.: 906   1st Qu.:  -5.00  
 Median :1401   Median :1359   Median :  -2.00  
 Mean   :1349   Mean   :1344   Mean   :  12.64  
 3rd Qu.:1744   3rd Qu.:1729   3rd Qu.:  11.00  
 Max.   :2400   Max.   :2359   Max.   :1301.00  
 NA's   :8255                  NA's   :8255     
    arr_time    sched_arr_time   arr_delay       
 Min.   :   1   Min.   :   1   Min.   : -86.000  
 1st Qu.:1104   1st Qu.:1124   1st Qu.: -17.000  
 Median :1535   Median :1556   Median :  -5.000  
 Mean   :1502   Mean   :1536   Mean   :   6.895  
 3rd Qu.:1940   3rd Qu.:1945   3rd Qu.:  14.000  
 Max.   :2400   Max.   :2359   Max.   :1272.000  
 NA's   :8713                  NA's   :9430      
   carrier              flight       tailnum         
 Length:336776      Min.   :   1   Length:336776     
 Class :character   1st Qu.: 553   Class :character  
 Mode  :character   Median :1496   Mode  :character  
                    Mean   :1972                     
                    3rd Qu.:3465                     
                    Max.   :8500                     
                                                     
    origin              dest              air_time    
 Length:336776      Length:336776      Min.   : 20.0  
 Class :character   Class :character   1st Qu.: 82.0  
 Mode  :character   Mode  :character   Median :129.0  
                                       Mean   :150.7  
                                       3rd Qu.:192.0  
                                       Max.   :695.0  
                                       NA's   :9430   
    distance         hour           minute     
 Min.   :  17   Min.   : 1.00   Min.   : 0.00  
 1st Qu.: 502   1st Qu.: 9.00   1st Qu.: 8.00  
 Median : 872   Median :13.00   Median :29.00  
 Mean   :1040   Mean   :13.18   Mean   :26.23  
 3rd Qu.:1389   3rd Qu.:17.00   3rd Qu.:44.00  
 Max.   :4983   Max.   :23.00   Max.   :59.00  
                                               
   time_hour                  
 Min.   :2013-01-01 05:00:00  
 1st Qu.:2013-04-04 13:00:00  
 Median :2013-07-03 10:00:00  
 Mean   :2013-07-03 05:22:54  
 3rd Qu.:2013-10-01 07:00:00  
 Max.   :2013-12-31 23:00:00  
                              
View(data)
data
head
tail
glimpse
str
skimr::skim()

6 Veriyi değiştirme

6.1 Veriyi kod ile değiştirelim

6.2 Veriyi eklentilerle değiştirme


6.3 RStudio aracılığıyla recode

questionr paketi kullanılacak


https://juba.github.io/questionr/articles/recoding_addins.html




7 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()
Parsed with column specification:
cols(
  Sepal.Length = col_double(),
  Sepal.Width = col_double(),
  Petal.Length = col_double(),
  Petal.Width = col_double(),
  Species = col_character()
)

 DESCRIPTIVES

 Descriptives                                          
 ───────────────────────────────────────────────────── 
                          Species       Sepal.Length   
 ───────────────────────────────────────────────────── 
   N                      setosa                  50   
                          versicolor              50   
                          virginica               50   
   Missing                setosa                   0   
                          versicolor               0   
                          virginica                0   
   Mean                   setosa                5.01   
                          versicolor            5.94   
                          virginica             6.59   
   Std. error mean        setosa              0.0498   
                          versicolor          0.0730   
                          virginica           0.0899   
   Median                 setosa                5.00   
                          versicolor            5.90   
                          virginica             6.50   
   Mode                   setosa                5.00   
                          versicolor            5.50   
                          virginica             6.30   
   Sum                    setosa                 250   
                          versicolor             297   
                          virginica              329   
   Standard deviation     setosa               0.352   
                          versicolor           0.516   
                          virginica            0.636   
   Variance               setosa               0.124   
                          versicolor           0.266   
                          virginica            0.404   
   Range                  setosa                1.50   
                          versicolor            2.10   
                          virginica             3.00   
   Minimum                setosa                4.30   
                          versicolor            4.90   
                          virginica             4.90   
   Maximum                setosa                5.80   
                          versicolor            7.00   
                          virginica             7.90   
   Skewness               setosa               0.120   
                          versicolor           0.105   
                          virginica            0.118   
   Std. error skewness    setosa               0.337   
                          versicolor           0.337   
                          virginica            0.337   
   Kurtosis               setosa              -0.253   
                          versicolor          -0.533   
                          virginica           0.0329   
   Std. error kurtosis    setosa               0.662   
                          versicolor           0.662   
                          virginica            0.662   
   25th percentile        setosa                4.80   
                          versicolor            5.60   
                          virginica             6.23   
   50th percentile        setosa                5.00   
                          versicolor            5.90   
                          virginica             6.50   
   75th percentile        setosa                5.20   
                          versicolor            6.30   
                          virginica             6.90   
 ───────────────────────────────────────────────────── 


7.1 summarytools

https://cran.r-project.org/web/packages/summarytools/vignettes/Introduction.html

7.1.1 Frequencies

Variable: iris$Species
Type: Factor (unordered)

  Freq % Valid % Valid Cum. % Total % Total Cum.
setosa 50 33.33 33.33 33.33 33.33
versicolor 50 33.33 66.67 33.33 66.67
virginica 50 33.33 100.00 33.33 100.00
<NA> 0 0.00 100.00
Total 150 100.00 100.00 100.00 100.00
  Freq % % Cum.
setosa 50 33.33 33.33
versicolor 50 33.33 66.67
virginica 50 33.33 100.00
Total 150 100.00 100.00

Cross-Tabulation / Row Proportions

Variables: smoker * diseased
Data Frame: tobacco
diseased
smoker Yes No Total
Yes 125 (41.95%) 173 (58.05%)  298 (100.00%)
No  99 (14.10%) 603 (85.90%)  702 (100.00%)
Total 224 (22.40%) 776 (77.60%) 1000 (100.00%)

Generated by summarytools 0.8.5 (R version 3.5.1)
2018-07-21

diseased
smoker Yes No
Yes 125 173
No 99 603

Generated by summarytools 0.8.5 (R version 3.5.1)
2018-07-21

Non-numerical variable(s) ignored: Species ### Descriptive Statistics
Data Frame: iris
N: 150

  Sepal.Length Sepal.Width Petal.Length Petal.Width
Mean 5.84 3.06 3.76 1.20
Std.Dev 0.83 0.44 1.77 0.76
Min 4.30 2.00 1.00 0.10
Q1 5.10 2.80 1.60 0.30
Median 5.80 3.00 4.35 1.30
Q3 6.40 3.30 5.10 1.80
Max 7.90 4.40 6.90 2.50
MAD 1.04 0.44 1.85 1.04
IQR 1.30 0.50 3.50 1.50
CV 7.06 7.01 2.13 1.57
Skewness 0.31 0.31 -0.27 -0.10
SE.Skewness 0.20 0.20 0.20 0.20
Kurtosis -0.61 0.14 -1.42 -1.36
N.Valid 150.00 150.00 150.00 150.00
Pct.Valid 100.00 100.00 100.00 100.00

Non-numerical variable(s) ignored: Species

  Mean Std.Dev Min Median Max
Sepal.Length 5.84 0.83 4.30 5.80 7.90
Sepal.Width 3.06 0.44 2.00 3.00 4.40
Petal.Length 3.76 1.77 1.00 4.35 6.90
Petal.Width 1.20 0.76 0.10 1.30 2.50

7.1.2 Data Frame Summary

tobacco
N: 1000

No Variable Stats / Values Freqs (% of Valid) Text Graph Valid Missing
1 gender
[factor]
1. F
2. M
489 (50.0%)
489 (50.0%)
IIIIIIIIIIIIIIII
IIIIIIIIIIIIIIII
978
(97.8%)
22
(2.2%)
2 age
[numeric]
mean (sd) : 49.6 (18.29)
min < med < max :
18 < 50 < 80
IQR (CV) : 32 (0.37)
63 distinct val. 975
(97.5%)
25
(2.5%)
3 age.gr
[factor]
1. 18-34
2. 35-50
3. 51-70
4. 71 +
258 (26.5%)
241 (24.7%)
317 (32.5%)
159 (16.3%)
IIIIIIIIIIIII
IIIIIIIIIIII
IIIIIIIIIIIIIIII
IIIIIIII
975
(97.5%)
25
(2.5%)
4 BMI
[numeric]
mean (sd) : 25.73 (4.49)
min < med < max :
8.83 < 25.62 < 39.44
IQR (CV) : 5.72 (0.17)
974 distinct val. 974
(97.4%)
26
(2.6%)
5 smoker
[factor]
1. Yes
2. No
298 (29.8%)
702 (70.2%)
IIIIII
IIIIIIIIIIIIIIII
1000
(100%)
0
(0%)
6 cigs.per.day
[numeric]
mean (sd) : 6.78 (11.88)
min < med < max :
0 < 0 < 40
IQR (CV) : 11 (1.75)
37 distinct val. 965
(96.5%)
35
(3.5%)
7 diseased
[factor]
1. Yes
2. No
224 (22.4%)
776 (77.6%)
IIII
IIIIIIIIIIIIIIII
1000
(100%)
0
(0%)
8 disease
[character]
1. Hypertension
2. Cancer
3. Cholesterol
4. Heart
5. Pulmonary
6. Musculoskeletal
7. Diabetes
8. Hearing
9. Digestive
10. Hypotension
[ 3 others ]
36 (16.2%)
34 (15.3%)
21 ( 9.5%)
20 ( 9.0%)
20 ( 9.0%)
19 ( 8.6%)
14 ( 6.3%)
14 ( 6.3%)
12 ( 5.4%)
11 ( 5.0%)
21 ( 9.4%)
IIIIIIIIIIIIIIII
IIIIIIIIIIIIIII
IIIIIIIII
IIIIIIII
IIIIIIII
IIIIIIII
IIIIII
IIIIII
IIIII
IIII
IIIIIIIII
222
(22.2%)
778
(77.8%)
9 samp.wgts
[numeric]
mean (sd) : 1 (0.08)
min < med < max :
0.86 < 1.04 < 1.06
IQR (CV) : 0.19 (0.08)
0.86!: 267 (26.7%)
1.04!: 249 (24.9%)
1.05!: 324 (32.4%)
1.06!: 160 (16.0%)
! rounded
IIIIIIIIIIIII
IIIIIIIIIIII
IIIIIIIIIIIIIIII
IIIIIII

1000
(100%)
0
(0%)

7.1.3 Descriptive Statistics

Data Frame: iris
Group: Species = setosa
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 5.01 0.35 4.30 5.00 5.80
Sepal.Width 3.43 0.38 2.30 3.40 4.40
Petal.Length 1.46 0.17 1.00 1.50 1.90
Petal.Width 0.25 0.11 0.10 0.20 0.60

Group: Species = versicolor
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 5.94 0.52 4.90 5.90 7.00
Sepal.Width 2.77 0.31 2.00 2.80 3.40
Petal.Length 4.26 0.47 3.00 4.35 5.10
Petal.Width 1.33 0.20 1.00 1.30 1.80

Group: Species = virginica
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 6.59 0.64 4.90 6.50 7.90
Sepal.Width 2.97 0.32 2.20 3.00 3.80
Petal.Length 5.55 0.55 4.50 5.55 6.90
Petal.Width 2.03 0.27 1.40 2.00 2.50

Output file written: /var/folders/76/rq_s_23s7fd5r8hqrbg8rmnc0000gp/T//RtmpxIdFKz/file8d943e622540.html

Group: Species = versicolor
N: 50
Mean Std.Dev Min Median Max
Sepal.Length 5.94 0.52 4.90 5.90 7.00
Sepal.Width 2.77 0.31 2.00 2.80 3.40
Petal.Length 4.26 0.47 3.00 4.35 5.10
Petal.Width 1.33 0.20 1.00 1.30 1.80
Group: Species = virginica
N: 50
Mean Std.Dev Min Median Max
Sepal.Length 6.59 0.64 4.90 6.50 7.90
Sepal.Width 2.97 0.32 2.20 3.00 3.80
Petal.Length 5.55 0.55 4.50 5.55 6.90
Petal.Width 2.03 0.27 1.40 2.00 2.50

Generated by summarytools 0.8.6 (R version 3.5.1)
2018-07-21

Output file appended: /var/folders/76/rq_s_23s7fd5r8hqrbg8rmnc0000gp/T//RtmpxIdFKz/file8d943e622540.html


7.1.4 Descriptive Statistics

Variable: tobacco$BMI by age.gr

  18-34 35-50 51-70 71 +
Mean 23.84 25.11 26.91 27.45
Std.Dev 4.23 4.34 4.26 4.37
Min 8.83 10.35 9.01 16.36
Median 24.04 25.11 26.77 27.52
Max 34.84 39.44 39.21 38.37

  Mean Std.Dev Min Median Max
18-34 23.84 4.23 8.83 24.04 34.84
35-50 25.11 4.34 10.35 25.11 39.44
51-70 26.91 4.26 9.01 26.77 39.21
71 + 27.45 4.37 16.36 27.52 38.37

Output file written: freq-tables.html

tobacco_subset$age.gr

Type: Factor (unordered)
Valid Total
age.gr Freq % % Cumul % % Cumul
18-34 258 26.46 26.46 25.80 25.80
35-50 241 24.72 51.18 24.10 49.90
51-70 317 32.51 83.69 31.70 81.60
71 + 159 16.31 100.00 15.90 97.50
<NA> 25 2.50 100.00
Total 1000 100.00 100.00 100.00 100.00

tobacco_subset$smoker

Type: Factor (unordered)
Valid Total
smoker Freq % % Cumul % % Cumul
Yes 298 29.80 29.80 29.80 29.80
No 702 70.20 100.00 70.20 100.00
<NA> 0 0.00 100.00
Total 1000 100.00 100.00 100.00 100.00
Output file appended: freq-tables.html


function ‘is’ appears not to be S3 generic; found functions that look like S3 methods‘>=’ not meaningful for factors$properties

$attributes.lengths names class row.names 5 1 150

$extensive.is [1] “is.data.frame” “is.list”
[3] “is.object” “is.recursive” [5] “is.unsorted”


### Frequencies   
**Variable:** tobacco$gender     
**Type:** Factor (unordered)   

|     &nbsp; | Freq | % Valid | % Valid Cum. | % Total | % Total Cum. |
|-----------:|-----:|--------:|-------------:|--------:|-------------:|
|      **F** |  489 |   50.00 |        50.00 |   48.90 |        48.90 |
|      **M** |  489 |   50.00 |       100.00 |   48.90 |        97.80 |
| **\<NA\>** |   22 |         |              |    2.20 |       100.00 |
|  **Total** | 1000 |  100.00 |       100.00 |  100.00 |       100.00 |

Frequencies

Variable: gender
Type: Factor (unordered)
Valid Total
gender Freq % % Cumul % % Cumul
F 489 50.00 50.00 48.90 48.90
M 489 50.00 100.00 48.90 97.80
<NA> 22 2.20 100.00
Total 1000 100.00 100.00 100.00 100.00

Generated by summarytools 0.8.6 (R version 3.5.1)
2018-07-21


7.2 Grafikler

Zorunlu paket yükleniyor: lattice
Zorunlu paket yükleniyor: ggformula

New to ggformula?  Try the tutorials: 
    learnr::run_tutorial("introduction", package = "ggformula")
    learnr::run_tutorial("refining", package = "ggformula")
Zorunlu paket yükleniyor: mosaicData
Zorunlu paket yükleniyor: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand


The 'mosaic' package masks several functions from core packages in order to add 
additional features.  The original behavior of these functions should not be affected by this.

Note: If you use the Matrix package, be sure to load it BEFORE loading mosaic.

Attaching package: ‘mosaic’

The following object is masked from ‘package:Matrix’:

    mean

The following object is masked from ‘package:questionr’:

    prop

The following objects are masked from ‘package:dplyr’:

    count, do, tally

The following object is masked from ‘package:purrr’:

    cross

The following object is masked from ‘package:ggplot2’:

    stat

The following objects are masked from ‘package:stats’:

    binom.test, cor, cor.test, cov, fivenum, IQR,
    median, prop.test, quantile, sd, t.test, var

The following objects are masked from ‘package:base’:

    max, mean, min, prod, range, sample, sum
Choose a plot type. 

1: 1-variable (histogram, density plot, etc.)
2: 2-variable (scatter, boxplot, etc.)
3: map


### Cross-Tabulation / Row Proportions   
**Variables:** gender * smoker     
**Data Frame:** tobacco   
   
|        |        |              |              |                |
|-------:|-------:|-------------:|-------------:|---------------:|
|        | smoker |          Yes |           No |          Total |
| gender |        |              |              |                |
|      F |        | 147 (30.06%) | 342 (69.94%) |  489 (100.00%) |
|      M |        | 143 (29.24%) | 346 (70.76%) |  489 (100.00%) |
| \<NA\> |        |   8 (36.36%) |  14 (63.64%) |   22 (100.00%) |
|  Total |        | 298 (29.80%) | 702 (70.20%) | 1000 (100.00%) |

descr(tobacco, style = ‘rmarkdown’)

print(descr(tobacco), method = ‘render’, table.classes = ‘st-small’)

dfSummary(tobacco, style = ‘grid’, plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = ‘render’)


8 Rcmdr

library(Rcmdr)
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


9 Sonraki Konular

  • RStudio ile GitHub
  • Hipotez testleri
  • R Markdown ve R Notebook ile tekrarlanabilir rapor

10 Diğer kodlar


11 Geri Bildirim


  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCi0tLQoKClshW10oaHR0cDovL3Jlcy5jbG91ZGluYXJ5LmNvbS9keWQ5MTFrbWgvaW1hZ2UvdXBsb2FkL2ZfYXV0byxxX2F1dG86YmVzdC92MTUzMDExMzA3Ny9JbWFnZV8yX3ZmeTQ4Yi5wbmcpXShodHRwczovL3d3dy5kYXRhY2FtcC5jb20vY29tbXVuaXR5L3R1dG9yaWFscy9kYXRhLXNjaWVuY2UtcGl0ZmFsbHMpCgoKIyBSIHnDvGtsZW1lCgpodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkKClshW1doYXQgaXMgUj9dKGh0dHA6Ly9pbWcueW91dHViZS5jb20vdmkvWGNCTEVWa25xdlkvMC5qcGcpXShodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkpCgoKIyMgUi1wcm9qZWN0CgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8KCi0tLQoKWyFbXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9pbWcvZW5naW5lLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM2KQoKLS0tCgojIyBSU3R1ZGlvCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8KCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvCgpodHRwczovL21vZGVybmRpdmUuY29tLzItZ2V0dGluZy1zdGFydGVkLmh0bWwKCi0tLQoKIyMjIFJTdHVkaW8gZWtsZW50aWxlcmkKCi0gRGlzY292ZXIgYW5kIGluc3RhbGwgdXNlZnVsIFJTdHVkaW8gYWRkaW5zCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYWRkaW5zbGlzdC9SRUFETUUuaHRtbAoKaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9yc3R1ZGlvYWRkaW5zLwoKYGBge3J9CmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicnN0dWRpby9hZGRpbmV4YW1wbGVzIiwgdHlwZSA9ICJzb3VyY2UiKQpgYGAKCgotLS0KCiMjIFgxMQoKaHR0cHM6Ly93d3cueHF1YXJ0ei5vcmcvCgotLS0KCiMjIEphdmEgT1MKCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20va2IvZGwxNTcyCgotLS0KCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCi0tLQoKCgpodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZQpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYXZhaWxhYmxlX3BhY2thZ2VzX2J5X25hbWUuaHRtbAoKLSBCaW9jb25kdWN0b3IKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKCi0tLQoKIyMgUiBpw6dpbiB5YXJkxLFtIGJ1bG1hCgoKYGBge3IgeWFyZMSxbX0KP21lYW4KPz9lZmV0Y2gKYGBgCgoKCi0gVmlnbmV0dGUKCiFbXShmaWd1cmVzL3ZpZ25ldHRlLnBuZykKCi0tLQoKLSBSRG9jdW1lbnRhdGlvbgpodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcKCi0gUiBQYWNrYWdlIERvY3VtZW50YXRpb24KaHR0cHM6Ly9yZHJyLmlvLwoKLSBHaXRIdWIKCi0gU3RhY2tvdmVyZmxvdwoKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS8KCi0gR29vZ2xlIHV5Z3VuIGFuYWh0YXIga2VsaW1lCgohW10oZmlndXJlcy9Hb29nbGUtcGFja2FnZS1uYW1lLnBuZykKCi0tLQoKCgohW10oZmlndXJlcy9Hb29nbGUtc3RhcnQtd2l0aC1SLnBuZykKCi0tLQoKLSBBd2Vzb21lIENoZWF0c2hlZXQKaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbHlhbmcvYXdlc29tZS1jaGVhdHNoZWV0CgpodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL2RvYy9jb250cmliL0JhZ2dvdHQtcmVmY2FyZC12Mi5wZGYKCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Jlc291cmNlcy9jaGVhdHNoZWV0cy8KCgotIEF3ZXNvbWUgUgoKaHR0cHM6Ly9naXRodWIuY29tL3FpbndmL2F3ZXNvbWUtUiNyZWFkbWUKCmh0dHBzOi8vYXdlc29tZS1yLmNvbS8KCgoKCi0gVHdpdHRlcgoKaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaAoKCi0tLQoKIyMgUiBwYWtldCB5w7xrbGVtZQoKYGBgCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoIlJjbWRyIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgpgYGB7ciBwYWtldCB5w7xrbGVtZX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgoKYGBge3IgcGFrZXQgw6dhxJ/EsXJtYSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBldmFsID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9CnJlcXVpcmUodGlkeXZlcnNlKQpyZXF1aXJlKGptdikKcmVxdWlyZShxdWVzdGlvbnIpCmxpYnJhcnkoc3VtbWFyeXRvb2xzKQpgYGAKCi0tLQoKIyBSIHN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKIyBSU3R1ZGlvIGlsZSB2ZXJpIHnDvGtsZW1lCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjE4NjExOTc3LUltcG9ydGluZy1EYXRhLXdpdGgtUlN0dWRpbwoKIVtdKGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlX2F0dGFjaG1lbnRzLzIwNjI3NzYxOC9kYXRhLWltcG9ydC1vdmVydmlldy5naWYpCgotLS0KCiMjIEV4Y2VsCgojIyBTUFNTCgojIyBjc3YKCgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+U3ByZWFkc2hlZXQgdXNlcnMgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT46ICB3aGVyZSYjMzk7cyB0aGUgZGF0YT88YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiB1c2VycyB1c2luZyBzcHJlYWRzaGVldHM6ICB3aGVyZSYjMzk7cyB0aGUgY29kZT88L3A+Jm1kYXNoOyBMZW9uYXJkIEtpZWZlciAoQGxlbmtpZWZlcikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9sZW5raWVmZXIvc3RhdHVzLzEwMTU1ODc0NzU1ODA5NTY2NzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSA3LCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgoKYGBge3IsIHJlc3VsdHM9Im1hcmt1cCJ9CmxpYnJhcnkobnljZmxpZ2h0czEzKQpzdW1tYXJ5KGZsaWdodHMpCmBgYAoKCgpgYGAKVmlldyhkYXRhKQpgYGAKCgpgYGAKZGF0YQpgYGAKCgpgYGAKaGVhZApgYGAKCgpgYGAKdGFpbApgYGAKCgpgYGAKZ2xpbXBzZQpgYGAKCgpgYGAKc3RyCmBgYAoKCmBgYApza2ltcjo6c2tpbSgpCmBgYAoKLS0tCgojIFZlcml5aSBkZcSfacWfdGlybWUKCiMjIFZlcml5aSBrb2QgaWxlIGRlxJ9pxZ90aXJlbGltCgojIyBWZXJpeWkgZWtsZW50aWxlcmxlIGRlxJ9pxZ90aXJtZQoKIVtdKGZpZ3VyZXMvY2hhbmdlX2RhdGEucG5nKQoKLS0tCgoKIyMgUlN0dWRpbyBhcmFjxLFsxLHEn8SxeWxhIHJlY29kZQoKKnF1ZXN0aW9uciogcGFrZXRpIGt1bGxhbsSxbGFjYWsKCiFbXShmaWd1cmVzL2xldmVsX3JlY29kZS5wbmcpCgotLS0KCgoKaHR0cHM6Ly9qdWJhLmdpdGh1Yi5pby9xdWVzdGlvbnIvYXJ0aWNsZXMvcmVjb2RpbmdfYWRkaW5zLmh0bWwKCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18xLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzIucG5nKQoKCi0tLQoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMy5wbmcpCgoKLS0tCgojIEJhc2l0IHRhbsSxbWxhecSxY8SxIGlzdGF0aXN0aWtsZXIKCmBgYApzdW1tYXJ5KCkKYGBgCgpgYGAKbWVhbgpgYGAKCmBgYAptZWRpYW4KYGBgCgpgYGAKbWluCmBgYAoKYGBgCm1heApgYGAKCmBgYApzZApgYGAKCmBgYAp0YWJsZSgpCmBgYAoKCmBgYHtyIGRlc2NyaXB0aXZlLCBlY2hvPVRSVUUsIGluY2x1ZGUgPSBUUlVFLCBmaWcuc2hvdz0nYW5pbWF0ZScsIGFuaW9wdHM9J2NvbnRyb2xzJ30KbGlicmFyeShyZWFkcikKaXJpc2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvaXJpcy5jc3YiKQoKam12OjpkZXNjcmlwdGl2ZXMoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB2YXJzID0gIlNlcGFsLkxlbmd0aCIsCiAgICBzcGxpdEJ5ID0gIlNwZWNpZXMiLAogICAgZnJlcSA9IFRSVUUsCiAgICBoaXN0ID0gVFJVRSwKICAgIGRlbnMgPSBUUlVFLAogICAgYmFyID0gVFJVRSwKICAgIGJveCA9IFRSVUUsCiAgICB2aW9saW4gPSBUUlVFLAogICAgZG90ID0gVFJVRSwKICAgIG1vZGUgPSBUUlVFLAogICAgc3VtID0gVFJVRSwKICAgIHNkID0gVFJVRSwKICAgIHZhcmlhbmNlID0gVFJVRSwKICAgIHJhbmdlID0gVFJVRSwKICAgIHNlID0gVFJVRSwKICAgIHNrZXcgPSBUUlVFLAogICAga3VydCA9IFRSVUUsCiAgICBxdWFydCA9IFRSVUUsCiAgICBwY0VxR3IgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3Igc2NhdHRlciwgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9CiMgaW5zdGFsbC5wYWNrYWdlcygic2NhdHIiKQoKc2NhdHI6OnNjYXQoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB4ID0gIlNlcGFsLkxlbmd0aCIsCiAgICB5ID0gIlNlcGFsLldpZHRoIiwKICAgIGdyb3VwID0gIlNwZWNpZXMiLAogICAgbWFyZyA9ICJkZW5zIiwKICAgIGxpbmUgPSAibGluZWFyIiwKICAgIHNlID0gVFJVRSkKCmBgYAoKIyMgc3VtbWFyeXRvb2xzCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3VtbWFyeXRvb2xzL3ZpZ25ldHRlcy9JbnRyb2R1Y3Rpb24uaHRtbAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyBsaWJyYXJ5KHN1bW1hcnl0b29scykKc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpmcmVxKGlyaXMkU3BlY2llcywgcmVwb3J0Lm5hcyA9IEZBTFNFLCBzdHlsZSA9ICJybWFya2Rvd24iLCBvbWl0LmhlYWRpbmdzID0gVFJVRSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkKSwgbWV0aG9kID0gJ3JlbmRlcicpKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIAogICAgIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkLCBwcm9wID0gJ24nLCB0b3RhbHMgPSBGQUxTRSksIAogICAgICAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBtZXRob2QgPSAicmVuZGVyIikpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmRlc2NyKGlyaXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZXNjcihpcmlzLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwgdHJhbnNwb3NlID0gVFJVRSwgCiAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KdmlldyhkZlN1bW1hcnkoaXJpcykpCgpgYGAKCgohW10oZmlndXJlcy9kZnN1bW1hcnkucG5nKQoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZlN1bW1hcnkodG9iYWNjbywgcGxhaW4uYXNjaWkgPSBGQUxTRSwgc3R5bGUgPSAiZ3JpZCIpCmBgYAoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgRmlyc3Qgc2F2ZSB0aGUgcmVzdWx0cwppcmlzX3N0YXRzX2J5X3NwZWNpZXMgPC0gYnkoZGF0YSA9IGlyaXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFUyA9IGlyaXMkU3BlY2llcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBkZXNjciwgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3NlID0gVFJVRSkKCiMgVGhlbiB1c2UgdmlldygpLCBsaWtlIHNvOgp2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcywgbWV0aG9kID0gInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KdmlldyhpcmlzX3N0YXRzX2J5X3NwZWNpZXMpCmBgYAoKIVtdKGZpZ3VyZXMvRGVzY3JpcHRpdmVTdGF0aXN0aWNzLnBuZykKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGF0YSh0b2JhY2NvKSAjIHRvYmFjY28gaXMgYW4gZXhhbXBsZSBkYXRhZnJhbWUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UKQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sIAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLCAKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLCAKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwgIHRyYW5zcG9zZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIsIG9taXQuaGVhZGluZ3MgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KdG9iYWNjb19zdWJzZXQgPC0gdG9iYWNjb1sgLGMoImdlbmRlciIsICJhZ2UuZ3IiLCAic21va2VyIildCmZyZXFfdGFibGVzIDwtIGxhcHBseSh0b2JhY2NvX3N1YnNldCwgZnJlcSkKdmlldyhmcmVxX3RhYmxlcywgZm9vdG5vdGUgPSBOQSwgZmlsZSA9ICdmcmVxLXRhYmxlcy5odG1sJykKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndoYXQuaXMoaXJpcykKYGBgCgotLS0KCmBgYHtyfQpmcmVxKHRvYmFjY28kZ2VuZGVyLCBzdHlsZSA9ICdybWFya2Rvd24nKQpgYGAKCi0tLQoKYGBge3J9CnByaW50KGZyZXEodG9iYWNjbyRnZW5kZXIpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgoKCgotLS0KCiMjIEdyYWZpa2xlcgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtb3NhaWMpCm1QbG90KGlyaXNkYXRhKQpgYGAKCi0tLQoKYGBge3J9CmN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpCmBgYAoKLS0tCgpgYGB7cn0KcHJpbnQoY3RhYmxlKHRvYmFjY28kZ2VuZGVyLCB0b2JhY2NvJHNtb2tlciksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCmRlc2NyKHRvYmFjY28sIHN0eWxlID0gJ3JtYXJrZG93bicpCgpwcmludChkZXNjcih0b2JhY2NvKSwgbWV0aG9kID0gJ3JlbmRlcicsIHRhYmxlLmNsYXNzZXMgPSAnc3Qtc21hbGwnKQoKZGZTdW1tYXJ5KHRvYmFjY28sIHN0eWxlID0gJ2dyaWQnLCBwbGFpbi5hc2NpaSA9IEZBTFNFKQoKcHJpbnQoZGZTdW1tYXJ5KHRvYmFjY28sIGdyYXBoLm1hZ25pZiA9IDAuNzUpLCBtZXRob2QgPSAncmVuZGVyJykKCgoKCi0tLQoKIyBSY21kcgoKYGBgCmxpYnJhcnkoUmNtZHIpCmBgYAoKCi0gQSBDb21wYXJhdGl2ZSBSZXZpZXcgb2YgdGhlIFIgQ29tbWFuZGVyIEdVSSBmb3IgUgoKaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3NvZnR3YXJlLXJldmlld3Mvci1jb21tYW5kZXIvCgoKLS0tCgojIFNvbnJha2kgS29udWxhcgoKLSBSU3R1ZGlvIGlsZSBHaXRIdWIKLSBIaXBvdGV6IHRlc3RsZXJpCi0gUiBNYXJrZG93biB2ZSBSIE5vdGVib29rIGlsZSB0ZWtyYXJsYW5hYmlsaXIgcmFwb3IKCgotLS0KCiMgRGnEn2VyIGtvZGxhcgoKLSBEacSfZXIga29kbGFyIGnDp2luIGJha8SxbsSxejogW2h0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9dKGh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby8pCgoKLS0tCgojIEdlcmkgQmlsZGlyaW0KCi0gR2VyaSBiaWxkaXJpbSBpw6dpbiB0xLFrbGF5xLFuxLF6OiBfW0dlcmkgYmlsZGlyaW0gZm9ybXVdKGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzKV8KCg==